"""
格式化工具模块 - 提供数据格式化功能
"""

import pandas as pd
from typing import Any, Union, Optional
from datetime import datetime

def format_number(value: Union[int, float], precision: int = 2, with_commas: bool = True) -> str:
    """
    格式化数字
    
    参数:
        value: 要格式化的数字
        precision: 小数位数
        with_commas: 是否使用千位分隔符
        
    返回:
        格式化后的字符串
    """
    if value is None:
        return "-"
    
    try:
        if isinstance(value, (int, float)):
            if with_commas:
                return f"{value:,.{precision}f}"
            else:
                return f"{value:.{precision}f}"
        return str(value)
    except Exception:
        return str(value)

def format_percentage(value: float, precision: int = 2) -> str:
    """
    格式化百分比
    
    参数:
        value: 要格式化的数字 (0.1 表示 10%)
        precision: 小数位数
        
    返回:
        格式化后的百分比字符串
    """
    if value is None:
        return "-"
    
    try:
        return f"{value * 100:.{precision}f}%"
    except Exception:
        return str(value)

def format_date(date_value: Union[str, datetime], format_str: str = "%Y-%m-%d") -> str:
    """
    格式化日期
    
    参数:
        date_value: 要格式化的日期
        format_str: 日期格式字符串
        
    返回:
        格式化后的日期字符串
    """
    if date_value is None:
        return "-"
    
    try:
        if isinstance(date_value, str):
            # 尝试解析字符串为日期
            date_obj = pd.to_datetime(date_value)
            return date_obj.strftime(format_str)
        elif isinstance(date_value, datetime):
            return date_value.strftime(format_str)
        return str(date_value)
    except Exception:
        return str(date_value)

def format_dataframe_for_streamlit(df: pd.DataFrame) -> pd.DataFrame:
    """
    处理DataFrame中的布尔值，将它们转换为字符串以避免PyArrow转换错误
    
    参数:
        df: 要处理的DataFrame
        
    返回:
        处理后的DataFrame
    """
    if df is None or not isinstance(df, pd.DataFrame) or df.empty:
        return df
        
    # 创建DataFrame的副本，避免修改原始数据
    result_df = df.copy()
    
    for col in result_df.columns:
        if result_df[col].dtype == 'object':
            # 将布尔值转换为字符串
            result_df[col] = result_df[col].apply(lambda x: str(x) if isinstance(x, bool) else x)
    
    return result_df